#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
#       estructuras.py

# TODO
#
# Ver que si se está en la raíz, el directorio de trabajo se toma como "None" o "/"
#





from datetime import datetime


class Error(Exception):
	"""Clase base para excepciones"""
	pass
	
class SistemaArchivosError(Error):
	"""Clase base para errores del Sistema de Archivos"""
	pass

class DirError(SistemaArchivosError):
	"""Erorres derivados del manejo de directorios"""
	def __init__(self, accion, mensaje):
		self.accion 	= accion	# Accion respectiva a directorios en la que ocurre el error
		self.mensaje 	= mensaje	# Mensaje descriptivo


class SistemaArchivos:
	"""Control del sistema de archivos"""
	#=============
	# "Globales"
	#=============
	MAX_APUNTADORES_DIRECTOS 	= 10
	MAX_LONGITUD_DATOS			= None	#Longitud de los datos que puede guardar un nodo NodoDatos
	#PERMISOS_POR_DEFECTO		= ''	#Corresponden a los NodosI
	
	usuario 					= None
	grupo						= None
	directorioDeTrabajo 		= None
	
	
	#=============
	# Composición... (Bueno, casi)
	#=============
	listaInicialDeNodosI = [] #En realidad, guardamos los números enteros correspondientes al id() de cada nodo
	listaRestoDeNodosI = []
	
	#=============
	# Acciones externas
	#=============
	def LeerArchivo(self):
		raise NotImplementedError
	
	def ObtenerInfo(self):
		raise NotImplementedError
	
	#=============
	# Operaciones
	#=============
	def MD(self, nombreDirectorio):
		"""Crea un directorio"""
		#Si el directorio actual de trabajo es None, se crea en la lista de los principales...
			#Esto es para evitar confusiones con nombres de archivo / directorio, e IDs.
		
		#~ if nombreDirectorio is None:
			#~ raise DirError('MD', 'No se ha especificado un nombre de directorio.')
		
		nuevoNodo = NodoI(nombreDirectorio, self.usuario, self.grupo, True)
		
		if self.directorioDeTrabajo is None:
			#El nuevo nodo va en la lista de los principales
			self.listaInicialDeNodosI.append(nuevoNodo)
		else:
			# Si el directorio de trabajo es otro, asignarlo a la lista del montón, y referenciarlo en el directorio de trabajo
			raise NotImplementedError
			
				
		
	def RD(self):
		"""Elimina directorio"""
		raise NotImplementedError
		
	def CD(self, nombreDirectorio):
		"""Cambia Directorio de trabajo"""
		if nombreDirectorio == '/':
			#Si se quiere cambiar a la raíz, tomamos el directorio de trabajo como None
			self.directorioDeTrabajo = None
		raise NotImplementedError
		
	def CF(self):
		"""Crea archivo"""
		raise NotImplementedError
		
	def DF(self):
		"""Elimina archivo"""
		raise NotImplementedError
		
	def WF(self):
		"""Escribe archivo"""
		raise NotImplementedError
		
	def DU(self):
		"""Definir usuario"""
		raise NotImplementedError
		
	def CG(self):
		"""Crear / Definir grupo"""
		raise NotImplementedError
		
	def AG(self):
		"""Asignar grupo a un archivo / directorio"""
		raise NotImplementedError

class NodoApuntador:
	apuntadoresDirectos = []

class NodoDatos:
	datos = None

#USAR... id(objeto) -> Int

class NodoI:
	"""Estructura usada como cabecera de directorios / archivos """
	PERMISOS_POR_DEFECTO = '111101101' # drwxrwxrwx
	mtime 			= None
	atime 			= None
	L1 				= None
	L2 				= None
	L3 				= None
	
	def __init__(self, nombre, usuario, grupo, esDirectorio):
		self.name 	= nombre
		self.size 	= 0							#Esto debe ser dinámicamente actualizado, pero para datos, no directorios
		self.user	= usuario					#Si es None, cualquiera tiene control total
		self.group	= grupo						#Si es None, cualquiera tiene control total
		self.mode	= "1" + self.PERMISOS_POR_DEFECTO if esDirectorio else "0" + self.PERMISOS_POR_DEFECTO	#Determina si es directorio
		self.ctime	= datetime.today()
		#mtime
		#atime
		self.apuntadoresDirectos = []	#No puede tener más de 10 elementos
		#L1
		#L2
		#L3

	
	def __repr__(self):
		return "<Nombre: %s>" % self.name
		

if __name__ == '__main__':
	#Sólo pruebas provisorias
	NodoPrueba = NodoI('', 'Gabriel', 'SO', True)
	print NodoPrueba.ctime
	#NodoPrueba.atime = 
	print NodoPrueba
	print NodoPrueba.atime
	print NodoPrueba.mode

	asd = SistemaArchivos()
	asd.CD()
